package com.itfenghuang.day02;

public class A05_练习 {
    public static void main(String[] args) {
        /**
        1、多态是什么，多态的前提条件是什么?
         同一个对象,在不同的时刻表现出了不同的形态

         两个类要有继承关系
         要有方法重写
         父类引用指向子类对象   Aniaml aniaml = new Cat();

        2、多态中成员访问的特点分别是什么?

         成员变量:
                不具备多态性
                java分为编译(javac)和运行阶段(java)
                口诀:编译看左边,运行看右边
         成员方法:
                具备多态性
                口诀:编译看左边,运行看右边

        3、多态的好处和弊端分别是什么？

                提高程序的扩展性
                不能够使用子类中特有的方法

        4、什么是向上转型，什么是向下转型？这个题不用做

        5、什么是抽象类，它的特点是什么？

            被abstract修饰的类

             如果一个类中有抽象方法,那么这个类一定是抽象类
             抽象类中可以有普通的方法,但是包含抽象方法的类一定是抽象类
             抽象类的子类,如果子类是普通类,那么一定要从写父类的抽象方法,除非子类也是抽象类
             抽象类不能被实例化(即不能创建对象)

        6、抽象类的成员特点有哪些?

         成员变量:   可以有变量,也可以有常量
         成员方法:   可以有普通方法,也可以有抽象方法
         构造方法:   有构造方法
         final  和 abstract  不能共存
         static 和 abstract 不能共存

        7、抽象类的面试题：

        A01_Practice、一个类如果没有抽象方法，可不可以定义为抽象类?如果可以，有什么意义?

             抽象可以把多个事物的共性的内容抽取出来，
             本质就是把我们关注的内容抽取出来

        可以定义为抽象类，但是如果没有了抽象方法，和普通的类没有任何的区别，所以没有意义。

        B、abstract不能和哪些关键字共存，为什么？

        private 因为private修饰的方法只能在本类中使用，而抽象类都是引用于类的继承

        static 静态的，要考虑静态资源的特点:被该类所有对象共享，
         在字节码文件加载的时候加载，通过类名直接调用。；
         如果使用static修饰抽象方法的话，抽象方法中没有方法体，调用抽象方法就没有意义了。

        final：同样，先考虑final的特点：
         修饰类，不可被继承，修饰方法，不可被重写，修饰变量，成为常量。
        如果抽象类不能被继承，抽象方法不能重写，那么抽象类就没有任何意义。

        8、什么是接口，它的特点是什么？

         interface   接口名{}
         制定规则;
         提高扩展性;
         接口不能实例化(创建对象)
         普通类实现接口,必须重写该接口的所有的抽象方法,如果是抽象方法,可以不重写

        9、接口的成员特点有哪些？

         成员变量的特点
         默认被public final static 修饰的,并且只能被这些修饰

         成员方法的特点
         抽象方法: 默认被public  abstract 修饰的


        11、根据需求，完成如下代码（按照标准格式写），并在测试类中进行测试。  这是三个不同的需求，也就是说是三个问题。
        需求一：
        已知猫类和狗类：
        属性:毛的颜色,腿的个数
        行为:吃饭
        猫特有行为:抓老鼠catchMouse
        狗特有行为:看家lookHome

        需求二：
        已知接口Play中有一个方法playGame()，再测试类中如何调用该方法？


        12.分析以下需求，并用代码实现
        进行描述笔记本类，实现笔记本使用USB鼠标、USB键盘
        1.定义USB接口:
        开启功能
                关闭功能

        2.定义笔记本类:
        开机功能
                关机功能
        定义使用USB设备的功能
        要求:既能使用鼠标也能使用键盘,使用USB功能内部调用开启和关闭功能

        3.定义鼠标类:
        要符合USB接口

        4.定义键盘类:
        要符合USB接口

        5.定义测试类:
        创建电脑对象,依次调用开机方法,使用USB设备, 关机方法

        打印效果如下:
        开机
                连接鼠标的USB
        断开鼠标的USB
                连接键盘的USB
        断开键盘的USB
                关机

        13.分析以下需求，并用代码实现
        1.定义动物类:
        属性:
        年龄
        行为:
        喝水,吃东西(吃什么不确定)
        2.定义游泳接口:
        行为:
        游泳方法
        3.定义狗类:
        行为:
        吃饭(啃骨头)和 游泳(狗刨)
                4.定义羊类:
        行为:
        吃饭(羊啃草)
        5.定义青蛙类:
        行为:
        吃饭(吃虫子)和 游泳(蛙泳)
                6.定义饲养员类:
        行为:
        饲养动物:包括吃饭和喝水
        7.定义测试类:

        创建饲养员对象,饲养员调用三次饲养方法:饲养狗,饲养羊,饲养青蛙

        要求:
        1.子类重写父类中的吃东西方法
        2.要求给狗和青蛙添加游泳的方法(实现游泳接口)
        3.饲养员类中定义一个方法,传入动物类对象(父类),
                调用吃饭方法,如果有游泳方法也需进行测试

        4.打印如下格式的结果:

        喝水
                狗啃骨头
        狗会狗刨游泳

                喝水
        青蛙吃小虫
                青蛙会蛙泳

        喝水
                羊啃草
        */

//        Cat11 cat11 = new Cat11();
//        cat11.playGame();
//        Dog11 dog11 = new Dog11();
//        dog11.playGame();
//        System.out.println(Play.color);

        Computer computer = new Computer();
        computer.open();
        computer.close();

    }
}
interface Play{
    public String color="熏衣紫";
    public int leg=4;
    public abstract void  playGame();
}

class Cat11 implements Play{
    @Override
    public void playGame() {
        System.out.println("铛铛");
    }
}
class  Dog11 implements Play{
    @Override
    public void playGame() {
        System.out.println("起飞咯");
    }
}



interface USB{
    void open();
    void close();
}

class Computer implements USB{

    @Override
    public void open() {
        System.out.println("开机");
        Keybord keybord = new Keybord();
        keybord.open();
    }

    @Override
    public void close() {
        Keybord keybord = new Keybord();
        keybord.close();
        System.out.println("关机");
    }
    class Keybord {
        public void open(){
            Mouse mouse = new Mouse();
            mouse.open();
            System.out.println("连接键盘的USB");
        }
        public void close(){
            System.out.println("断开键盘的USB");
            Mouse mouse = new Mouse();
            mouse.close();
        }
        class Mouse {
            public void open(){
                System.out.println("连接鼠标的USB");
            }
            public void close(){
                System.out.println("断开鼠标的USB");
            }
        }
    }

}















